bitkeeper revision 1.1705.1.14 (42a9a5deJbK8YHFnSDDIGurt2uATXA)
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 10 Jun 2005 14:38:22 +0000 (14:38 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Fri, 10 Jun 2005 14:38:22 +0000 (14:38 +0000)
Manual merge.

1  2 
xen/arch/x86/traps.c

index cf7aaa3d198fcbc200a07874103535d440a6e3d1,9e761a3050a72454d735080d21f597d9d47dd104..2986d9c2b558e7518c833ff2aa3fefacfb445390
@@@ -422,28 -421,35 +422,29 @@@ asmlinkage int do_page_fault(struct cpu
              return EXCRET_fault_fixed;
          }
  
 -        if ( (addr < PAGE_OFFSET) &&
 -             !VM86_MODE(regs) && ((regs->cs & 3) == 1) && /* ring 1 */
 +        if ( (addr < HYPERVISOR_VIRT_START) &&
++             KERNEL_MODE(v, regs) &&
               ((regs->error_code & 3) == 3) && /* write-protection fault */
 -             ptwr_do_page_fault(addr) )
 +             ptwr_do_page_fault(d, addr) )
          {
 -            if ( unlikely(d->mm.shadow_mode) )
 -                (void)shadow_fault(addr, regs->error_code);
 +            UNLOCK_BIGLOCK(d);
              return EXCRET_fault_fixed;
          }
 +        UNLOCK_BIGLOCK(d);
      }
  
 -    if ( unlikely(d->mm.shadow_mode) && 
 -         (addr < PAGE_OFFSET) && shadow_fault(addr, regs->error_code) )
 +    if ( unlikely(shadow_mode_enabled(d)) &&
 +         ((addr < HYPERVISOR_VIRT_START) ||
 +          (shadow_mode_external(d) && GUEST_CONTEXT(v, regs))) &&
 +         shadow_fault(addr, regs) )
          return EXCRET_fault_fixed;
  
 -    if ( unlikely(addr >= LDT_VIRT_START) && 
 -         (addr < (LDT_VIRT_START + (d->mm.ldt_ents*LDT_ENTRY_SIZE))) )
 -    {
 -        /*
 -         * Copy a mapping from the guest's LDT, if it is valid. Otherwise we
 -         * send the fault up to the guest OS to be handled.
 -         */
 -        off  = addr - LDT_VIRT_START;
 -        addr = d->mm.ldt_base + off;
 -        if ( likely(map_ldt_shadow_page(off >> PAGE_SHIFT)) )
 -            return EXCRET_fault_fixed; /* successfully copied the mapping */
 -    }
 +    if ( unlikely(addr >= PERDOMAIN_VIRT_START) &&
 +         unlikely(addr < PERDOMAIN_VIRT_END) &&
 +         handle_perdomain_mapping_fault(addr - PERDOMAIN_VIRT_START, regs) )
 +        return EXCRET_fault_fixed;
  
 -    if ( !GUEST_FAULT(regs) )
 +    if ( !GUEST_MODE(regs) )
          goto xen_fault;
  
      propagate_page_fault(addr, regs->error_code);